home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ROCKSVGA.ZIP / KEYBOARD.PAS < prev    next >
Pascal/Delphi Source File  |  1993-08-19  |  3KB  |  184 lines

  1. Unit
  2.   Keyboard;
  3.  
  4. INTERFACE
  5.  
  6. uses
  7.   Dos;
  8.  
  9. const
  10.   kSYSREQ=$54;
  11.   kCAPSLOCK=$3A;
  12.   kNUMLOCK=$45;
  13.   kSCROLLLOCK=$46;
  14.   kLEFTCTRL=$1D;
  15.   kLEFTALT=$38;
  16.   kLEFTSHIFT=$2A;
  17.   kRIGHTCTRL=$9D;
  18.   kRIGHTALT=$B8;
  19.   kRIGHTSHIFT=$36;
  20.   kESC=$01;
  21.   kBACKSPACE=$0E;
  22.   kENTER=$1C;
  23.   kSPACE=$39;
  24.   kTAB=$0F;
  25.   kF1=$3B;
  26.   kF2=$3C;
  27.   kF3=$3D;
  28.   kF4=$3E;
  29.   kF5=$3F;
  30.   kF6=$40;
  31.   kF7=$41;
  32.   kF8=$42;
  33.   kF9=$43;
  34.   kF10=$44;
  35.   kF11=$57;
  36.   kF12=$58;
  37.   kA=$1E;
  38.   kB=$30;
  39.   kC=$2E;
  40.   kD=$20;
  41.   kE=$12;
  42.   kF=$21;
  43.   kG=$22;
  44.   kH=$23;
  45.   kJ=$24;
  46.   kK=$25;
  47.   kL=$26;
  48.   kM=$32;
  49.   kN=$31;
  50.   kO=$18;
  51.   kP=$19;
  52.   kQ=$10;
  53.   kR=$13;
  54.   kS=$1F;
  55.   kT=$14;
  56.   kU=$16;
  57.   kV=$2F;
  58.   kW=$11;
  59.   kX=$2D;
  60.   kY=$15;
  61.   kZ=$2C;
  62.   k1=$02;
  63.   k2=$03;
  64.   k3=$04;
  65.   k4=$05;
  66.   k5=$06;
  67.   k6=$07;
  68.   k7=$08;
  69.   k8=$09;
  70.   k9=$0A;
  71.   k0=$0B;
  72.   kMINUS=$0C;
  73.   kEQUAL=$0D;
  74.   kLBRACKET=$1A;
  75.   kRBRACKET=$1B;
  76.   kSEMICOLON=$27;
  77.   kTICK=$28;
  78.   kAPOSTROPHE=$29;
  79.   kBACKSLASH=$2B;
  80.   kCOMMA=$33;
  81.   kPERIOD=$34;
  82.   kSLASH=$35;
  83.   kINS=$D2;
  84.   kDEL=$D3;
  85.   kHOME=$C7;
  86.   kEND=$CF;
  87.   kPGUP=$C9;
  88.   kLARROW=$CB;
  89.   kRARROW=$CD;
  90.   kUARROW=$C8;
  91.   kDARROW=$D0;
  92.   kKEYPAD0=$52;
  93.   kKEYPAD1=$4F;
  94.   kKEYPAD2=$50;
  95.   kKEYPAD3=$51;
  96.   kKEYPAD4=$4B;
  97.   kKEYPAD5=$4C;
  98.   kKEYPAD6=$4D;
  99.   kKEYPAD7=$47;
  100.   kKEYPAD8=$48;
  101.   kKEYPAD9=$49;
  102.   kKEYPADDEL=$53;
  103.   kKEYPADSTAR=$37;
  104.   kKEYPADMINUS=$4A;
  105.   kKEYPADPLUS=$4E;
  106.   kKEYPADENTER=$9C;
  107.   kCNTRLPRTSC=$B7;
  108.   kSHIFTPRTSC=$B7;
  109.   kKEYPADSLASH=$B5;
  110.  
  111. type
  112.   keyboardObj=object
  113.     constructor Init;
  114.     destructor Done;
  115.     function Down(b: byte): boolean;
  116.   end;
  117.  
  118. var
  119.   OldInt9: pointer;                { saves location of old OldInt9 vector }
  120.   Keys: array [0..255] of boolean; { array that holds key values }
  121.   e0Flag: byte;
  122.  
  123. IMPLEMENTATION
  124.  
  125. {$F+}
  126. procedure NewInt9; interrupt; assembler;
  127. asm
  128.   cli
  129.   in      al, $60                       { get scan code from keyboard port }
  130.   cmp     al, $E0                       { al = $E0 key ? }
  131.   jne     @@SetScanCode
  132.   mov     [e0Flag], 128
  133.   mov     al, 20h                       { Send 'generic' EOI to PIC }
  134.   out     20h, al
  135.   jmp     @@exit
  136. @@SetScanCode:
  137.   mov     bl, al                        { Save scancode in BL }
  138.   and     bl, 01111111b
  139.   add     bl, [e0Flag]
  140.   xor     bh, bh
  141.   and     al, 10000000b                 { keep break bit, if set }
  142.   xor     al, 10000000b                 { flip bit, 1 means pressed, 0 no }
  143.   rol     al, 1                         { move breakbit to bit 0 }
  144.   mov     [offset keys + bx], al
  145.   mov     [e0Flag], 0
  146.   mov     al, 20h                       { send EOI to PIC }
  147.   out     20h, al
  148. @@exit:
  149.   sti
  150. end;
  151. {$F-}
  152.  
  153. procedure SetNewInt9;
  154. begin
  155.   GetIntVec($09, OldInt9);         { save old location of INT 09 handler }
  156.   SetIntVec($09, Addr(NewInt9));   { point to new routine }
  157. end;
  158.  
  159. procedure SetOldInt9;
  160. begin
  161.   SetIntVec($09, OldInt9);         { point back to original routine }
  162. end;
  163.  
  164. constructor keyboardObj.Init;
  165. begin
  166.   SetNewInt9;                      { point to new keyboard routine }
  167.   FillChar(Keys, 256, 0);          { clear the keys array }
  168. end;
  169.  
  170. destructor keyboardObj.Done;
  171. begin
  172.   SetOldInt9;                      { point back to original keyboard routine }
  173. end;
  174.  
  175. function keyboardObj.Down(b: byte): boolean;
  176. begin
  177.   if keys[b] then
  178.     Down:=true
  179.   else
  180.     Down:=false;
  181. end;
  182.  
  183. END.
  184.